package hr.ctg.domain.model;

// Generated 2007.05.02 22:50:59 by Hibernate Tools 3.2.0.b9

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.NotNull;

/**
 * Otok generated by hbm2java
 */
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "otok")
@NamedQueries( {
		@NamedQuery(name = "Otok.findAllOByNaziv", query = "SELECT o FROM Otok o order by o.naziv"),
		@NamedQuery(name = "Otok.findByObjekti", query = "SELECT DISTINCT o FROM Objekt ob JOIN ob.mjesto m JOIN m.otok o order by o.naziv"),
		@NamedQuery(name = "Otok.findByIdZupanijeObjekti", query = "SELECT DISTINCT o FROM Objekt ob JOIN ob.mjesto m JOIN m.zupanija z JOIN m.otok o WHERE z.idZupanje = ? order by o.naziv"),
		@NamedQuery(name = "Otok.findByIdZupanije", query = "SELECT DISTINCT o FROM Otok o JOIN o.mjestos m JOIN m.zupanija z WHERE z.idZupanje = ? order by o.naziv"),
		@NamedQuery(name = "Otok.findLikeNazivByIdZupanijeObjekti", query = "SELECT DISTINCT o FROM Objekt ob JOIN ob.mjesto m JOIN m.zupanija z JOIN m.otok o WHERE z.idZupanje = ? and o.naziv like ?"),
		@NamedQuery(name = "Otok.findFirstLetters", query = "SELECT DISTINCT SUBSTRING(o.naziv,1,1) FROM Otok o order by o.naziv"),
		@NamedQuery(name = "Otok.findByFirstLetter", query = "SELECT o FROM Otok o WHERE SUBSTRING(o.naziv,1,1) = ?"),
		@NamedQuery(name = "Otok.findLikeNaziv", query = "select distinct(o) from Otok o where o.naziv like ?"),
		@NamedQuery(name = "Otok.findTopByOcjena", query = "select o from Otok o join o.dojamPosjetiteljas dpo group by o order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Otok.findTopByPosjetOtoka", query = "select o from Otok o join o.posjetOtokas p group by o order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Otok.findTopByOcjenaIdZupanije", query = "select o from Otok o join o.mjestos m join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ? group by m order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Otok.findTopByPosjetOtokaIdZupanije", query = "select o from Otok o join o.mjestos m join o.posjetOtokas p where m.zupanija.idZupanje = ? group by o order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Otok.findCountTopByOcjenaIdZupanije", query = "select count(o) from Otok o join o.mjestos m join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ?"),
		@NamedQuery(name = "Otok.findCountTopByPosjetOtokaIdZupanije", query = "select count(o) from Otok o join o.mjestos m join o.posjetOtokas p where m.zupanija.idZupanje = ?"),
		@NamedQuery(name = "Otok.findFirstLettersByObjOpObj", query = "SELECT DISTINCT SUBSTRING(ot.naziv,1,1) FROM Otok ot where (select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.mjesto.otok = ot) > 0 or (select count(o) from Opis o where o.mjesto.otok = ot) > 0"),
		@NamedQuery(name = "Otok.findByFirstLetterObjOpObj", query = "SELECT ot FROM Otok ot WHERE SUBSTRING(ot.naziv,1,1) = ? and ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.mjesto.otok = ot) > 0 or (select count(o) from Opis o where o.mjesto.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByObjOpObj", query = "SELECT ot FROM Otok ot WHERE ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o where o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByObjOpObjJezik", query = "SELECT ot FROM Otok ot WHERE ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findCountByObjOpObjJezik", query = "SELECT count(ot) FROM Otok ot WHERE ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByOOOIdZupanije", query = "SELECT ot FROM Otok ot join ot.mjestos m WHERE m.zupanija.idZupanje = ? and ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.mjesto.otok = ot) > 0 or (select count(o) from Opis o where o.mjesto.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByObjektiIdZupanije", query = "select distinct o.mjesto.otok from Objekt o where o.mjesto.zupanija.idZupanje = ? order by o.naziv"),
		@NamedQuery(name = "Otok.findByOOOIdZupanijeJezik", query = "SELECT distinct ot FROM Otok ot join ot.mjestos m WHERE m.zupanija.idZupanje = ? and ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByFirstLetterObjOpObjJezik", query = "select distinct ot from Otok ot where SUBSTRING(ot.naziv,1,1) = ? and ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findFirstLettersByObjOpObjJezik", query = "select distinct SUBSTRING(ot.naziv,1,1) from Otok ot where ((select count(o) from Objekt o where o.mjesto.otok = ot) > 0 or (select count(o) from Objava o where o.otok = ot) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.otok = ot) > 0) order by ot.naziv"),
		@NamedQuery(name = "Otok.findByIdFM", query = "select o from Otok o join fetch o.mjestos m where o.idOtoka= ?"),
		@NamedQuery(name = "Otok.findTopByPosjetMjestaJezik", query = "select o from Otok o join o.posjetOtokas p join o.opisOtokas op where op.jezik.oznaka = ? group by o order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Otok.findByLatLonOpisNotNull", query = "select m from Otok m join m.opisOtokas o where m.longituda is not null and m.latituda is not null"),
		@NamedQuery(name = "Otok.findBrojPosjeta", query = "select sum(p.brojPosjeta) from Posjet p where p.otok.idOtoka = ?") })
// @NamedNativeQueries( { @NamedNativeQuery(name = "Otok.findNBrojPosjeta",
// query =
// "select IFNULL(sum(posjet0_.broj_posjeta),0) from posjet posjet0_ where posjet0_.id_otoka=?1")
// })
public class Otok implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3164773015546853934L;
	private int idOtoka;
	private String naziv;
	private Double longituda;
	private Double latituda;
	private Integer zoom;
	private String opis;
	private String www;
	private int brojSlika;
	private String panoramio;
	private Set<Mjesto> mjestos = new HashSet<Mjesto>(0);
	private Set<Posjet> posjetOtokas = new HashSet<Posjet>(0);
	private Set<Opis> opisOtokas = new HashSet<Opis>(0);
	private Set<DojamPosjetitelja> dojamPosjetiteljas = new HashSet<DojamPosjetitelja>(
			0);
	private Set<DnevnikAktivnosti> dnevnikAktivnostis = new HashSet<DnevnikAktivnosti>(
			0);
	private Set<Slika> slikas = new HashSet<Slika>(0);
	private Set<Objava> objavas = new HashSet<Objava>(0);
	private Integer brojPosjeta;

	public void setBrojPosjeta(Integer brojPosjeta) {
		this.brojPosjeta = brojPosjeta;
	}

	public Otok() {
	}

	public Otok(final int idOtoka) {
		this.idOtoka = idOtoka;
	}

	public Otok(final int idOtoka, final String naziv) {
		this.idOtoka = idOtoka;
		this.naziv = naziv;
	}

	public Otok(final int idOtoka, final String naziv, final Set<Mjesto> mjestos) {
		this.idOtoka = idOtoka;
		this.naziv = naziv;
		this.mjestos = mjestos;
	}

	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		final Otok other = (Otok) obj;
		if (idOtoka != other.idOtoka) {
			return false;
		}
		return true;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id_otoka", unique = true, nullable = false)
	@NotNull
	public int getIdOtoka() {
		return idOtoka;
	}

	@Column(name = "latituda", nullable = false)
	public Double getLatituda() {
		return latituda;
	}

	@Column(name = "longituda", nullable = false)
	public Double getLongituda() {
		return longituda;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<Mjesto> getMjestos() {
		return mjestos;
	}

	@Column(name = "naziv", nullable = false)
	@NotNull
	public String getNaziv() {
		return naziv;
	}

	@Column(name = "opis")
	public String getOpis() {
		return opis;
	}

	@Column(name = "zoom", nullable = false)
	public Integer getZoom() {
		return zoom;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + idOtoka;
		return result;
	}

	public void setIdOtoka(final int idOtoka) {
		this.idOtoka = idOtoka;
	}

	public void setLatituda(final Double latituda) {
		this.latituda = latituda;
	}

	public void setLongituda(final Double longituda) {
		this.longituda = longituda;
	}

	public void setMjestos(final Set<Mjesto> mjestos) {
		this.mjestos = mjestos;
	}

	public void setNaziv(final String naziv) {
		this.naziv = naziv;
	}

	public void setOpis(final String opis) {
		this.opis = opis;
	}

	public void setZoom(final Integer zoom) {
		this.zoom = zoom;
	}

	@Override
	public String toString() {
		return Integer.toString(idOtoka);
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<Posjet> getPosjetOtokas() {
		return posjetOtokas;
	}

	public void setPosjetOtokas(final Set<Posjet> posjetOtokas) {
		this.posjetOtokas = posjetOtokas;
	}

	@Column(name = "www")
	public String getWww() {
		return www;
	}

	public void setWww(final String www) {
		this.www = www;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<Opis> getOpisOtokas() {
		return opisOtokas;
	}

	public void setOpisOtokas(final Set<Opis> opisOtokas) {
		this.opisOtokas = opisOtokas;
	}

	public Opis getOpis(final String currentLanguage) {
		if (opisOtokas != null) {
			for (final Opis opisObjekta : opisOtokas) {
				if (opisObjekta.getJezik().getOznaka().equals(currentLanguage)) {
					return opisObjekta;
				}
			}
		}
		return null;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<DojamPosjetitelja> getDojamPosjetiteljas() {
		return dojamPosjetiteljas;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<Slika> getSlikas() {
		return slikas;
	}

	public void setSlikas(final Set<Slika> slikas) {
		this.slikas = slikas;
	}

	public void setDojamPosjetiteljas(
			final Set<DojamPosjetitelja> dojamPosjetiteljas) {
		this.dojamPosjetiteljas = dojamPosjetiteljas;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<DnevnikAktivnosti> getDnevnikAktivnostis() {
		return dnevnikAktivnostis;
	}

	public void setDnevnikAktivnostis(
			final Set<DnevnikAktivnosti> dnevnikAktivnostis) {
		this.dnevnikAktivnostis = dnevnikAktivnostis;
	}

	@Transient
	public int getBrojSlika() {
		return brojSlika;
	}

	public void setBrojSlika(final int brojSlika) {
		this.brojSlika = brojSlika;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "otok")
	public Set<Objava> getObjavas() {
		return objavas;
	}

	public void setObjavas(final Set<Objava> objavas) {
		this.objavas = objavas;
	}

	@Transient
	public Zupanija getZupanija() {
		if (mjestos.size() > 0) {
			for (final Mjesto m : mjestos) {
				return m.getZupanija();
			}
		}
		return new Zupanija();
	}

	// @Formula("(select sum(p.broj_posjeta) from posjet p where p.id_otoka=id_otoka)")
	@Transient
	public Integer getBrojPosjeta() {
		return brojPosjeta;
	}

	@Column(name = "panoramio")
	public String getPanoramio() {
		return panoramio;
	}

	public void setPanoramio(String panoramio) {
		this.panoramio = panoramio;
	}
}
